﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using SOM.AbstractDALFactory;
using SOM.Common;
using SOM.ConcreteBL;
using SOM.ConcreteDAL;
using SOM.ConcreteDALFactory;
using SOM.Facade;
using SOM.Model;
using Subgurim.Controles;

public partial class Reclamacao_ReclamacoesMapa : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Common.RetornarUsuarioSessao(this) == null)
        {
            FormsAuthentication.RedirectToLoginPage();
            return;
        }

        if (!IsPostBack)
        {
            ReclamacaoBL reclamacaoBL = new ReclamacaoBL();

            List<Reclamacao> reclamacoesList = reclamacaoBL.ReturnAll();

            if (reclamacoesList.Count > 0)
            {
                if (reclamacoesList[0].loc_localizacao != null)
                {
                    GLatLng gLatLng = new GLatLng(reclamacoesList[0].loc_localizacao.loc_ds_latitude.Value,
                                                  reclamacoesList[0].loc_localizacao.loc_ds_longitude.Value);
                    gMapa.setCenter(gLatLng, 6);
                }

                foreach (Reclamacao reclamacao in reclamacoesList)
                {
                    if (reclamacao.loc_localizacao != null)
                        MarcarPosicao(reclamacao);
                }
            }

            else
            {
                gMapa.setCenter(Common.PosicaoPadrao);
            }
        }
    }

    /// <summary>
    /// Marca a posição da reclamação no mapa.
    /// </summary>
    /// <param name="reclamacao"></param>
    private void MarcarPosicao(Reclamacao reclamacao)
    {
        if (reclamacao.loc_localizacao == null) return;

        GLatLng gLatLng = new GLatLng(reclamacao.loc_localizacao.loc_ds_latitude.Value,
            reclamacao.loc_localizacao.loc_ds_longitude.Value);

        GIcon gIcon = new GIcon();
        gIcon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
        gIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
        gIcon.iconSize = new GSize(12, 20);
        gIcon.shadowSize = new GSize(22, 20);

        GMarker gMarker = new GMarker(gLatLng, gIcon);

        GInfoWindow gInfoWindow = new GInfoWindow(gMarker, GerarDescricaoReclamacao(reclamacao));

        ConfigurarMapa();
        gMapa.Add(gInfoWindow);

    }

    /// <summary>
    /// Gera a descrição que aparecerá na popup quando o usuário clicar.
    /// </summary>
    /// <param name="reclamacao"></param>
    /// <returns></returns>
    private string GerarDescricaoReclamacao(Reclamacao reclamacao)
    {
        SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
        InstituicaoDAL instituicaoDAL = factory.CreateInstituicaoDAL();
        Instituicao instituicao = instituicaoDAL.Load(reclamacao.ins_instituicao.ins_id_instituicao);

        StringBuilder descricaoPopup = new StringBuilder();
        descricaoPopup.Append("<b>" + reclamacao.ins_instituicao.ins_nm_instituicao + "</b><br/>");
        if (instituicao.end_endereco != null)
        {
            descricaoPopup.Append(instituicao.end_endereco.end_nm_logradouro + "<br/>" +
                instituicao.end_endereco.end_nm_bairro + " " + instituicao.end_endereco.end_ds_complemento + "<br/>" +
                instituicao.end_endereco.end_nm_cidade + " - " + instituicao.end_endereco.end_ds_estado + "<br/>");
        }
        descricaoPopup.Append("Data da reclamação: " + reclamacao.rec_dt_data + "<br/>");
        descricaoPopup.Append("Usuário: " + reclamacao.usr_usuario.usr_ds_nickname + "<br/>");
        descricaoPopup.Append("<a href=\"../Reclamacao/ReclamacaoDetalhes.aspx?op=1&recId=" +
            reclamacao.rec_id_reclamacao + "\">" + "Ver mais detalhes..." + "</a>");

        return descricaoPopup.ToString();
    }

    /// <summary>
    /// Monta o estilo do mapa que será exibido.
    /// </summary>
    private void ConfigurarMapa()
    {
        gMapa.enableGoogleBar = false;
        gMapa.addControl(new GControl(new CarouselMapTypeControl()));
        gMapa.addControl(new GControl(GControl.preBuilt.SmallZoomControl3D));
        gMapa.addControl(new GControl(GControl.extraBuilt.MarkCenter));
        gMapa.addControl(new GControl(GControl.extraBuilt.TextualCoordinatesControl, new GControlPosition(GControlPosition.position.Bottom_Right)));
        gMapa.enableHookMouseWheelToZoom = true;
        gMapa.enableGKeyboardHandler = true;
        gMapa.enableDoubleClickZoom = true;
    }
    protected void btnPesquisar_Click(object sender, EventArgs e)
    {
        LimparMapa();
        AtualizarMapa();
    }

    /// <summary>
    /// Atualiza o mapa de acordo com as opções de pesquisa;
    /// </summary>
    private void AtualizarMapa()
    {
        ReclamacaoBL reclamacaoBL = new ReclamacaoBL();
        List<Reclamacao> reclamacoesList = new List<Reclamacao>();

        DateTime dataInicial = new DateTime();
        DateTime dataFinal = new DateTime();

        //Metodo de pesquisa por descricao
        if (rblMetodoPesquisa.SelectedItem.Value.Equals("descricao"))
        {
            //Se for branco retorna todas as reclamações.
            if (string.IsNullOrEmpty(txtPesquisa.Text.Trim()))
            {
                reclamacoesList = reclamacaoBL.ReturnAll();
            }
            else
                reclamacoesList = reclamacaoBL.FindByDescricao(txtPesquisa.Text.Trim());
        }

        //Metodo de pesquisa por palavra-chave
        if (rblMetodoPesquisa.SelectedItem.Value.Equals("palavraChave"))
        {
            //Se for branco retorna todas as reclamações.
            if (string.IsNullOrEmpty(txtPesquisa.Text.Trim()))
            {
                reclamacoesList = reclamacaoBL.ReturnAll();
            }
            else
                reclamacoesList = reclamacaoBL.FindByPalavraChave(txtPesquisa.Text.Trim());
        }

        if (reclamacoesList != null)
        {
            if (string.IsNullOrEmpty(txtDataInicial.Text))
            {
                dataInicial = DateTime.MinValue;
            }
            else
            {
                dataInicial = Convert.ToDateTime(txtDataInicial.Text);
            }
            if (string.IsNullOrEmpty(txtDataFinal.Text))
            {
                dataFinal = DateTime.MaxValue;
            }
            else
            {
                dataFinal = Convert.ToDateTime(txtDataFinal.Text).AddDays(1);
            }

            List<Reclamacao> reclamacaoListaData =
                reclamacoesList.Where(rec => rec.rec_dt_data >= dataInicial).Where(rec => rec.rec_dt_data < dataFinal).ToList();

            foreach (Reclamacao reclamacao in reclamacaoListaData)
            {
                MarcarPosicao(reclamacao);
            }
        }
    }

    private void LimparMapa()
    {
        gMapa.resetInfoWindows();
    }
}
